home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 5 / Gold Medal Software - Volume 5 (Gold Medal) (1995).iso / database / cff51b.arj / BLOBTEST.C next >
C/C++ Source or Header  |  1993-10-22  |  6KB  |  256 lines

  1. /* BLOBTEST.C */
  2. /* Copyright 1990, 1991, 1992, 1993 Norman D. Culver Ft. Lauderdale, FL */
  3. /*                    All Rights Reserved                                   */
  4.  
  5. #include <stdlib.h>
  6. #include "../cff.h"
  7.  
  8. #define CLOCKS_PER_SECOND 1000000L
  9.  
  10. /* TEST CHOICES */
  11. #define PFLAGS 0
  12. #define MEMFILE 1
  13. #define EXTDMEM 1
  14. #define CFFFILE 1
  15.  
  16. extern int errno;
  17. extern long clock();
  18. extern int rand();
  19. OPNINFO info;
  20.  
  21. static void blob_test(void *hd);
  22.  
  23. void
  24. main()
  25. {
  26. void *hxxx;
  27. void *huniq;
  28. void *hcfile;
  29. void *hsxxx;
  30. void *hcxxx;
  31.  
  32.     cfport_settestflags(1);
  33.     cfinit("blobtest",1024,NULL);
  34.     cfprintf("TEST OF LARGE CHUNK ACCESS -- 128K per chunk\n");
  35.  
  36.     
  37. #if MEMFILE
  38.     cfprintf("MEMORY FILE\n");
  39.     hxxx = cfopen("MEMORY/XXX",F_RDWR|F_CREAT,NULL);
  40.     if(!hxxx) {
  41.         cfprintf("ERROR: create XXX err=%d\n", errno);
  42.         exit(0);
  43.     }
  44.     huniq = cfopen("MEMORY/XXX",
  45.                     F_RDWR|F_CREAT|F_TEMP|F_UNIQ|F_HUGEDIR, &info);
  46.     if(!huniq) {
  47.         cfprintf("ERROR: create UNIQUE TEMP FILE err=%d\n", errno);
  48.         exit(0);
  49.     }
  50. #if PFLAGS
  51.     cfpflags("hxxx", hxxx);
  52.     cfpflags("huniq", huniq);
  53. #endif
  54.     blob_test(huniq);
  55. cfprintf("NOW CLOSING\n");
  56.     cfclose(huniq);
  57. #endif /* MEMFILE */
  58.  
  59. #if EXTDMEM
  60.     cfprintf("EXTDMEM FILE\n");
  61.     hsxxx = cfopen("EXTDMEM/XXX", F_RDWR|F_CREAT|F_HUGEDIR, &info);
  62.     if(!hsxxx) {
  63.         cfprintf("ERROR: create EXTDMEM/XXX err=%d\n", errno);
  64.         exit(0);
  65.     }
  66. #if PFLAGS
  67.     cfpflags("hsxxx", hsxxx);
  68. #endif
  69.     cfsetlazy(hsxxx);
  70.     blob_test(hsxxx);
  71. cfprintf("NOW CLOSING\n");
  72.     cfclose(hsxxx);
  73.  
  74.     cfprintf("REOPEN EXTDMEM FILE\n");    
  75.     hsxxx = cfopen("EXTDMEM/XXX", F_RDWR, NULL);
  76.     if(!hsxxx) {
  77.         cfprintf("ERROR: reopen EXTDMEM:/XXX err=%d\n", errno);
  78.         exit(0);
  79.     }
  80.     cfsetlazy(hsxxx);
  81.     blob_test(hsxxx);
  82. cfprintf("NOW CLOSING\n");
  83.     cfunlink(hsxxx, NULL);
  84. #endif /* EXTDMEM */
  85.  
  86. #if CFFFILE
  87.     cfprintf("CFF DISK FILE\n");
  88.     hcfile = cfopen("testfile.cff", F_RDWR|F_CREAT, NULL);
  89.     if(!hcfile) {    
  90.         cfprintf("ERROR: create testfile.cff err=%d\n", errno);
  91.         exit(0);
  92.     }
  93.     hcxxx = cfopen("testfile.cff/XXX",
  94.                         F_RDWR|F_CREAT|F_HUGEDIR, &info);
  95.     if(!hcxxx) {    
  96.         cfprintf("ERROR: create testfile.cff/XXX err=%d\n", errno);
  97.         exit(0);
  98.     }
  99. #if 0
  100.     cfpflags("hcfile", hcfile);
  101.     cfpflags("hcxxx", hcxxx);
  102. #endif
  103.     cfsetlazy(hcxxx);
  104.     blob_test(hcxxx);
  105. cfprintf("NOW CLOSING\n");
  106.     cfclose(hcxxx);
  107.     cfclose(hcfile);
  108.  
  109.     cfprintf("REOPEN CFF DISK FILE\n");    
  110.     hcfile = cfopen("testfile.cff", F_RDWR, NULL);
  111.     if(!hcfile) {    
  112.         cfprintf("ERROR: reopen testfile.cff err=%d\n", errno);
  113.         exit(0);
  114.     }
  115.     hcxxx = cfopen("testfile.cff/XXX", F_RDWR, NULL);
  116.     if(!hcxxx) {    
  117.         cfprintf("ERROR: reopen testfile.cff/XXX err=%d\n", errno);
  118.         exit(0);
  119.     }
  120.     cfsetlazy(hcxxx);
  121.     blob_test(hcxxx);
  122. cfprintf("NOW CLOSING\n");
  123.     cfclose(hcxxx);
  124.     cfclose(hcfile);
  125.     cfunlink("testfile.cff");
  126. #endif /* CFF FILE */
  127.  
  128.     cfexit();
  129. } /* MAIN */
  130.  
  131.  
  132. static void
  133. blob_test(void *hd)
  134. {
  135. long i, start, end, diff;
  136. int result;
  137.  
  138.     if(cfisnew(hd)) {
  139.         start = clock();
  140.         for(i = 0; i < 20; ++i)
  141.         {
  142.         STOR addr;
  143.           if((result=cfinsert(hd, &i, 4, cfgetspace(hd, 128*1024, &addr))) < OK)
  144.           {
  145.             cfprintf("CFINSERT FAILED at i=%d result=%d\n", i, result);
  146.                 break;
  147.           }
  148.           else 
  149.           { /* Put some data in the chunk */
  150.           long *lp = cflocalize(hd, &addr);
  151.             if(lp == NULL) {
  152.                 cfprintf("INSERT FAILED TO LOCALIZE CHUNK i=%d loc=%lx\n", i, addr.a0);
  153.             }
  154.             lp[0] = i;
  155.             lp[100] = (100<<8)+i;
  156.             lp[32000] = (32000<<8)+i;
  157.             cfrelease(lp, R_DIRTY);
  158.           }
  159.             if(i == 0)
  160.                 cfprintf("  First chunk at loc=%lx size=%lu\n", addr.a0, addr.a2.size);
  161.         }            
  162.         end = clock();
  163.         diff = end - start;
  164.         diff /= CLOCKS_PER_SECOND/10;
  165.         if(diff == 0) diff = 1;
  166.         cfprintf("  CHUNKCREATES PER SEC = %ld\n", (i*10) / diff);
  167.     }
  168.  
  169.  
  170.     /* FIND CHUNKS */
  171.     start = clock();
  172.     for(i = 0; i < 20; ++i)
  173.     {
  174.     STOR addr;
  175.       if((result=cffind(hd, &i, 4, &addr)) < FOUND)
  176.       {
  177.         cfprintf("CFFIND FAILED at i=%d result=%d\n", i, result);
  178.             break;
  179.       }
  180.       else 
  181.       { /* Check the data in the chunk */
  182.       long *lp = cflocalize(hd, &addr);
  183.         if(lp == NULL) {
  184.             cfprintf("FIND FAILED TO LOCALIZE CHUNK i=%d loc=%lx size=%lu\n",
  185.             i, addr.a0, addr.a2.size);
  186.             break;
  187.         }
  188.         if(        lp[0] != i
  189.             ||    lp[100] != (100<<8)+i
  190.             ||    lp[32000] != (32000<<8)+i)
  191.             cfprintf("BAD DATA IN CHUNK at loc=%lx i=%d\n", addr.a0, i);
  192.         cfrelease(lp, R_CLEAN);
  193.       }
  194.     }            
  195.     end = clock();
  196.     diff = end - start;
  197.     diff /= CLOCKS_PER_SECOND/10;
  198.     if(diff == 0) diff = 1;
  199.     cfprintf("  CHUNKACCESSES PER SEC = %ld\n", (i*10) / diff);
  200.  
  201.  
  202.     /* RDWR CHUNKS */
  203.     start = clock();
  204.     for(i = 0; i < 20; ++i)
  205.     {
  206.     STOR addr;
  207.     void *handle;
  208.     long buf[1024];
  209.     long j,k;
  210.       if((result=cffind(hd, &i, 4, &addr)) < FOUND)
  211.       {
  212.         cfprintf("CFFIND FAILED at i=%d result=%d\n", i, result);
  213.             break;
  214.       }
  215.       if(!(handle = cfopen_chunk(hd, &addr)))
  216.       {
  217.           cfprintf("COULD NOT OPEN CHUNK at loc=%lx i=%d\n", addr.a0, i);
  218.           break;
  219.       }
  220.       for(j = 0; j < (128*1024)/sizeof(buf); ++j)
  221.       {
  222.         for(k = 0; k < 1024; ++k)
  223.         {
  224.             buf[k] = (((j*1024)+k)<<8)+i;
  225.         }
  226.         if((result = cfwrite(handle, buf, sizeof(buf))) != sizeof(buf)) {
  227.             cfprintf("WRITE ERROR = %d at i=%d j=%d k=%d\n", result,i,j,k);
  228.             break;
  229.         }
  230.       }
  231.       cfseek(handle, 0, S_SET);
  232.       for(j = 0; j < (128*1024)/sizeof(buf); ++j)
  233.       {
  234.         if((result = cfread(handle, buf, sizeof(buf))) == sizeof(buf)) {
  235.             for(k = 0; k < 1024; ++k)
  236.             {
  237.                 if(buf[k] != (((j*1024)+k)<<8)+i) {
  238.                     cfprintf("BAD DATA in RDWR chunk at i=%d j=%d k=%d\n", i,j,k);
  239.                     break;
  240.                 }
  241.             }
  242.         } else {
  243.             cfprintf("READ ERROR = %d at i=%d j=%d k=%d\n", result,i,j,k);
  244.             break;
  245.         }
  246.       }
  247.       cfclose(handle);
  248.     }
  249.     end = clock();
  250.     diff = end - start;
  251.     diff /= CLOCKS_PER_SECOND/10;
  252.     if(diff == 0) diff = 1;
  253.     cfprintf("  CHUNKRDWR BYTES PER SEC = %ld\n", (i*128*1024*10) / diff);
  254. }
  255.  
  256.